package com.yfp.client.service;

import com.github.binarywang.wxpay.bean.notify.WxPayPartnerNotifyV3Result;
import com.github.binarywang.wxpay.bean.notify.WxPayPartnerRefundNotifyV3Result;
import com.yfp.client.domain.Combo;
import com.yfp.client.domain.OrderCombo;
import com.yfp.client.domain.OrderList;
import com.yfp.client.domain.dto.*;
import com.yfp.client.domain.dto.*;
import com.yfp.client.domain.vo.DetailVO;
import com.yfp.client.domain.vo.OrderCreateVO;
import com.yfp.client.domain.vo.OrderVO;
import com.yfp.client.util.Response;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 
 * @version 1.0
 * @date 2024-05-24 10:32
 */
public interface OrderService {

    /**
     * 用户查询订单列表
     *
     * @param orderComboList
     * @param orderListDTO
     * @return
     */
    List<OrderVO> getAllOrder(List<OrderCombo> orderComboList, OrderListDTO orderListDTO);

    /**
     * 获取订单详情信息
     *
     * @param orderId
     * @param latitude
     * @param longitude
     * @return
     */
    DetailVO detail(String orderId, String latitude, String longitude);

    /**
     * 订单结算
     *
     * @param orderCreateDTO
     * @return
     */
    ClientCouponBestDTO settlementInfoOrder(OrderCreateDTO orderCreateDTO);

    /**
     * 获取订单结算信息
     *
     * @param orderCreateDTO
     * @param clientId
     * @param comboMapByComboId
     * @return
     */
    ClientCouponBestDTO getClientCouponBestDTO(OrderCreateDTO orderCreateDTO, String clientId, Map<String, Combo> comboMapByComboId);

    /**
     * 创建订单
     *
     * @param orderCreateDTO
     */
    OrderCreateVO createOrder(OrderCreateDTO orderCreateDTO);

    /**
     * 取消订单
     *
     * @param orderId
     * @param reason  取消理由
     */
    Boolean cancelOrder(String orderId, String reason);

    /**
     * 获取订单二维码
     *
     * @param orderDetailBtnDTO
     * @return
     */
    String getQRCode(OrderDetailBtnDTO orderDetailBtnDTO);

    /**
     * 订单退款
     *
     * @param orderId
     */
    Boolean refundOrder(String orderId, String refundReason);

    /**
     * 微信支付创建订单回调
     *
     * @param wxPayPartnerNotifyV3Result
     */
    void orderCreateNotify(WxPayPartnerNotifyV3Result wxPayPartnerNotifyV3Result);

    /**
     * 余额支付创建订单回调
     *
     * @param balancePayDTO
     * @param storedResultsDTO
     */
    void orderCreateBalanceNotify(BalancePayDTO balancePayDTO, StoredCalculateResultDTO storedResultsDTO);

    /**
     * 微信支付退款回调
     *
     * @param wxPayPartnerRefundNotifyV3Result
     */
    void orderRefundNotify(WxPayPartnerRefundNotifyV3Result wxPayPartnerRefundNotifyV3Result);

    /**
     * 订单操作-客服代取
     *
     * @param orderDetailBtnDTO
     * @return
     */
    Boolean operationPickup(OrderDetailBtnDTO orderDetailBtnDTO);

    /**
     * 订单操作-立即制作
     *
     * @param orderDetailBtnDTO
     * @return
     */
    Response<?> makePackage(OrderDetailBtnDTO orderDetailBtnDTO);

    /**
     * 检查所有用户订单是否过期
     */
    void checkAllOrderExpired();

    /**
     * 检查当前用户订单是否过期
     */
    void checkUserOrderExpired();

    /**
     * 根据用户id查询订单
     *
     * @param orderListDTO
     * @return
     */
    List<OrderCombo> listByUserIdAndStatus(OrderListDTO orderListDTO);

    /**
     * 获取等待数量
     * 未生产到自己的订单，取排队信息多的那一列数据进行展示
     *
     * @param machineId
     * @return
     */
    Integer getAwaitNum(String machineId);

    /**
     * 是否是霸王免单券，如果是直接跳过支付
     * 这里模拟微信支付的回调
     *
     * @param order
     * @return
     */
    OrderCreateVO simulateWechatPay(OrderCreateVO order);

    /**
     * 是否是霸王免单券
     *
     * @param couponId
     * @return
     */
    Boolean isBabyCouponOrder(Long couponId);

    /**
     * 模拟微信支付退款回调
     *
     * @param orderCombo
     */
    void simulateWechatPayOrderRefundNotify(OrderCombo orderCombo);

    /**
     * 余额支付退款回调
     *
     * @param orderList
     * @param amt
     */
    void balancePayOrderRefundNotify(OrderList orderList, BigDecimal amt);

    /**
     * 订单状态提醒
     *
     * @return
     */
    DetailVO remindOrderStatus();

    /**
     * 下单后引导弹窗
     * 下单前三次弹窗提示
     *
     * @return
     */
    Boolean guidancePopup();

    /**
     * 是否是第一次下单
     *
     * @return
     */
    Boolean isFirstOrder();

    /**
     * 余额支付
     *
     * @param balancePayDTO
     */
    void balancePay(BalancePayDTO balancePayDTO);

    /**
     * 余额支付-下一步
     *
     * @param balancePayDTO
     */
    void balancePayNext(BalancePayDTO balancePayDTO);

    /**
     * 根据客户id获取订单号
     * @param clientId
     * @return
     */
    List<String> orderIdList(String clientId);
}
